/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nextel.project.canje;
import com.nextel.project.Configuracion;
import com.nextel.project.agps.ControlAgps;
import com.nextel.project.canje.bean.CabCanjeBean;
import com.nextel.project.canje.bean.CanjeDetalleBean;
import com.nextel.project.canje.mvc.MVCCanjeDatos;
import com.nextel.project.canje.mvc.MVCCanjeFin;
import com.nextel.project.canje.mvc.MVCMotivoCanje;
import com.nextel.project.canje.mvc.MVCResumenCanje;
import com.nextel.project.canje.rms.RMSCanje;
import com.nextel.project.cliente.ControlCliente;
import com.nextel.project.cliente.mvc.MVCClienteDetalle;
import com.nextel.project.dao.HttpControl;
import com.nextel.project.dao.XMLDAO;
import com.nextel.project.pedido.bean.ArticuloBean;
import com.nextel.project.pedido.bean.ArticuloPorCodigoBean;
import com.nextel.project.pedido.bean.ArticuloPorNombreBean;
import com.nextel.project.pedido.mvc.MVCProductoBusqueda;
import com.nextel.project.pedido.mvc.MVCProductoPedido;
import com.nextel.project.pedido.mvc.MVCProductoResultado;
import com.nextel.project.pedido.rms.RMSArticulo;
import com.nextel.project.pedido.rms.RMSArticuloPorCodigo;
import com.nextel.project.pedido.rms.RMSArticuloPorNombre;
import com.nextel.project.pedido.rms.RMSKPI;
import com.nextel.project.reporte.bean.ReporteKPIBean;
import com.nextel.project.reporte.mvc.MVCReporteKPI;
import com.nextel.project.usuario.ControlUsuario;
import pe.com.nextel.main.ControlBase;
import java.io.InputStream;
import javax.microedition.io.HttpConnection;
import pe.com.nextel.idioma.IdiomaManager;
import pe.com.nextel.util.Fecha;
import pe.com.nextel.util.Iterator;
import pe.com.nextel.util.List;
import pe.com.nextel.util.StringUtils;

/**
 *
 *
 */
public class ControlCanje extends ControlBase {
    
    private static final ControlCanje control = new ControlCanje();
    //current
    public CabCanjeBean currentCabCanje;
    public CanjeDetalleBean currentCanjeDetalle;
    public ReporteKPIBean currentKPI;
    // rms
    public final RMSArticulo rmsArticulo = new RMSArticulo();
    public final RMSArticuloPorCodigo rmsArticuloPorCodigo = new RMSArticuloPorCodigo();
    public final RMSArticuloPorNombre rmsArticuloPorNombre = new RMSArticuloPorNombre();
    public final RMSKPI rmsKPI = new RMSKPI();
    public final RMSCanje rmsCanje = new RMSCanje();
    
    public final MVCProductoBusqueda mvcProductoBusqueda = new MVCProductoBusqueda();
    public final MVCClienteDetalle mvcClienteDetalle = new MVCClienteDetalle();
    public final MVCCanjeDatos mvcCanjeDatos = new MVCCanjeDatos();
    public final MVCMotivoCanje mvcCanjeLista = new MVCMotivoCanje();
    
    public final MVCProductoPedido mvcProductoPedido = new MVCProductoPedido();
    public final MVCProductoResultado mvcProductoResultado = new MVCProductoResultado();
    
    public final MVCCanjeFin mvcCanjeFin = new MVCCanjeFin();
    public final MVCMotivoCanje mvcMotivoCanje = new MVCMotivoCanje();
    public final MVCResumenCanje mvcResumenCanje = new MVCResumenCanje();
    
    public final MVCReporteKPI mvcReporteKPI = new MVCReporteKPI();
//    public final BarsCanvas mvcGrafico = new BarsCanvas();
    
    public Thread threadBusqueda;
    public static final byte CANJE = 3;
    private byte busquedaMVC = 3;
    
    /**
     * metodo de acceso para instanciar los recordStored
     */
    public static ControlCanje getInstance() {
        return control;
    }
    
    public void joinThreadBusqueda() {
        try {
            if (threadBusqueda != null && threadBusqueda.isAlive()) {
                threadBusqueda.join();
            }
        } catch (Exception e) {
        }
    }
    
    /**
     * para no crear mas instancias
     */
    private ControlCanje() {
        
    }
    
    public void procesarKpi(){
        try{
            currentKPI = rmsKPI.obtenerKPI();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    /*****************************************************************************/
    /********************LOGICA DE NEGOCIO **************************************/
    /*****************************************************************************/
    public void iniciarCanje() {
        try {
            // limpiamos las transacciones
            limpiarMemoriaTransacciones();
            currentCabCanje = new CabCanjeBean(ControlUsuario.getInstance().currentUsuario, ControlCliente.getInstance().currentCliente);
            currentCabCanje.setFecRegistro( Fecha.getFechaActualCompleta() );
            mvcProductoBusqueda.setBusquedaMVC(busquedaMVC);
            if("1".equals(ControlUsuario.getInstance().currentUsuario.gps)){
                if (ControlAgps.getInstance().currentGPS != null) {
                    currentCabCanje.latitud=ControlAgps.getInstance().currentGPS.getLatitude();
                    currentCabCanje.longitud=ControlAgps.getInstance().currentGPS.getLongitude();
                }
            }
            currentCabCanje.setFechMobil(Fecha.getDate().getTime());
            //setCurrent(mvcProductoBusqueda);
            setCurrent(mvcResumenCanje);
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error : " + e, ControlCliente.getInstance().mvcClienteBusqueda.showScreen());
        }
    }
    
    public void grabarCanje() {
        try {
            if("1".equals(ControlUsuario.getInstance().currentUsuario.gps)){
                if (ControlAgps.getInstance().currentGPS != null) {
                    currentCabCanje.latitud=ControlAgps.getInstance().currentGPS.getLatitude();
                    currentCabCanje.longitud=ControlAgps.getInstance().currentGPS.getLongitude();
                }}
            this.incrementarKpi();
            
            if( !ControlCliente.getInstance().currentCliente.isEnLinea() ) {
                ControlCliente.getInstance().currentCliente.setEstado(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_VISITADO));
                ControlCliente.getInstance().rmsCliente.actualizarObjectLista(ControlCliente.getInstance().currentCliente);
            }
            rmsCanje.grabarCanje(currentCabCanje);
            
            this.enviarCanje();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public void incrementarKpi() throws Exception {
        // contabilizamos los kpi
        this.procesarKpi();
        
        if( ControlCliente.getInstance().currentCliente.getEstado().equals( IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_POR_VISITAR) ) ||  ControlCliente.getInstance().currentCliente.getEstado().equals(null) ) { 
            currentKPI.clienteVisitados = currentKPI.clienteVisitados + 1 ;
        }
        rmsKPI.guardarKPI(currentKPI);
    }
    
    public void enviarCanje() throws Exception {
        //#debug
        System.out.println("Ingresa a enviarCanje");
        
        if(!StringUtils.withSignal()) {
            showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOCOBERTURA_ENVIO), ControlCliente.getInstance().mvcClienteDetalle.showScreen() );//"Zona sin cobertura, procesar el env\u00EDo mediante la opci\u00F3n ENVIOS del menu principal"
            return;
        }        
        this.enviarCanjeFunc();
        
    }

    public void enviarCanjeTotal() throws Exception {

        if(!StringUtils.withSignal()) {
            showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOCOBERTURA_ENVIO), ControlUsuario.getInstance().mvcEnvio.showScreen() );//"Zona sin cobertura, procesar el env\u00EDo mediante la opci\u00F3n ENVIOS del menu principal"
            return;
        }
        this.enviarCanjeFunc();

    }

    public void enviarCanjeFunc() throws Exception
    {
        List Listapendientes = rmsCanje.getAllBean();
        System.out.println("Listapendientes= " + Listapendientes);
        getMensajeHttp().setTipoEnvio(HttpConnection.POST);
        getMensajeHttp().setUrl(Configuracion.URL_ENVIO_CANJE);
        getMensajeHttp().setMensaje(XMLDAO.getInstance().writeXMLCanje(Listapendientes).getBytes());

        System.out.println("url =" + Configuracion.URL_ENVIO_CANJE);
        System.out.println("data =" + XMLDAO.getInstance().writeXMLCanje(Listapendientes));

        HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_CANJE);
        iniciarConexionHTTP();
    }

    
    public void actualizarCanje(InputStream in) {
        
        //System.out.println("actualizarCanje");
        
        try {
            XMLDAO.getInstance().parseMensajeXML(in);
            limpiarMemoriaTransacciones();
            rmsCanje.deleteAll();
            if(ControlCliente.getInstance().currentCliente != null){
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_CANJE_REGISTRADO), ControlCliente.getInstance().mvcClienteDetalle.showScreen());//"Canje registrado"
            }else if (busquedaMVC == CANJE){
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_CANJE_REGISTRADO), ControlUsuario.getInstance().mvcEnvio.showScreen());//"Canje registrado"
            }
        } catch (Exception e) {
            e.printStackTrace();
            
            if(ControlCliente.getInstance().currentCliente != null){
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOATENDIO_CANJE)+": " + e, ControlCliente.getInstance().mvcClienteDetalle.showScreen());//No se pudo atender el canje
            }else if (busquedaMVC == CANJE){
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOATENDIO_CANJE)+": " + e, ControlUsuario.getInstance().mvcEnvio.showScreen());
            }
        }
    }
    
    public List getListCanjesPorCliente() {
        try {
            
            return rmsCanje.getListaCanjePorCliente(ControlCliente.getInstance().currentCliente);
            
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error" + e, ControlCliente.getInstance().mvcClienteDetalle.showScreen());
        }
        return null;
    }
    
    public int getNumeroCanjesPendientes() {
        
        int total = 0;
        try {
            List lst = getCanjesPendientes();
            if ((lst != null) && (lst.size() >= 0)) {
                total = lst.size();
            }
                    
        } catch (Exception e) {
            e.printStackTrace();
            total = 0;
        }
        
        return total;
        
    }
    
    public List getCanjesPendientes() {
        try {
            
            return rmsCanje.getCanjePendientesEnvio();
            
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error" + e, ControlCliente.getInstance().mvcClienteDetalle.showScreen());
        }
        return null;
    }
    
    public void modificarDevolucion() {
        try {
            currentCanjeDetalle = (null);
        } catch (Exception e) {
            e.printStackTrace();
            
            showError("Error" + e, ControlCliente.getInstance().mvcClienteBusqueda.showScreen());
            
        }
        
    }
    
    /*********************************************************************************/
    /**********************  ARTICULO  ***********************************************/
    /*********************************************************************************/
    public CanjeDetalleBean getArticulo(ArticuloPorNombreBean articuloPorNombre) {
        
//        System.out.println("Midlet.getArticulo");
        
        try {
            ArticuloBean articulo = (ArticuloBean) rmsArticulo.getObject(articuloPorNombre.getIdRecordArticulo(), articuloPorNombre.getPosRecordArticulo());
            
            if( existeArticulo(articulo.getCodigo()) ) {
                ControlCanje.getInstance().showMensaje( IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ARTICULO_EXISTE_CANJE), ControlCanje.getInstance().mvcResumenCanje.showScreen( ) );//"El articulo ya existe en el canje"
                return null;
            }
            
            CanjeDetalleBean ddev = new CanjeDetalleBean();
            ddev.setCodigoArticulo(articulo.getCodigo());
            ddev.setNombreArticulo(articulo.getNombre());
            currentCanjeDetalle = (ddev);
            return ddev;
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error" + e, mvcProductoBusqueda.showScreen());
        }
        return null;
    }
    
    public CanjeDetalleBean buscarPorCodigoProducto(String codigo) {
        
//        System.out.println("Midlet.buscarPorCodigoProducto");
        try {
            ArticuloPorCodigoBean articuloPorcodigo = rmsArticuloPorCodigo.buscarArticulo(codigo);
            
            if (articuloPorcodigo != null) {
                if( existeArticulo(articuloPorcodigo.getCodigoArticulo()) ) {
                    ControlCanje.getInstance().showMensaje( IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ARTICULO_EXISTE_CANJE), ControlCanje.getInstance().mvcResumenCanje.showScreen() );//"El articulo ya existe en el canje"
                    return null;
                }
                ArticuloBean articulo = (ArticuloBean) rmsArticulo.getObject(articuloPorcodigo.getIdRecordArticulo(), articuloPorcodigo.getPosRecordArticulo());
                CanjeDetalleBean ddev = new CanjeDetalleBean();
                ddev.setCodigoArticulo(articulo.getCodigo());
                ddev.setNombreArticulo(articulo.getNombre());
                currentCanjeDetalle = ddev;
                return ddev;
            } else {
                ControlCanje.getInstance().showError(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ARTICULO)+" " + codigo + " "+IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOEXISTE), ControlCanje.getInstance().mvcResumenCanje.showScreen());//"El Art\u00EDculo"   ;"NO existe"
                return null;
            }
        } catch (Exception e) {
            showError("Error : " + e, mvcProductoBusqueda.showScreen());
        }
        return null;
    }
    
    public boolean existeArticulo(String codigo) {
        Iterator it = ControlCanje.getInstance().currentCabCanje.getLstCanjeDetalle().iterator();
        while( it.hasNext() ) {
            String codArtCanje = ((CanjeDetalleBean)it.next()).getCodigoArticulo();
            if( codigo.equals( codArtCanje ) )
                return true;
        }
        return false;
    }
    
    public void buscarPorNombreProducto(final String nombre) {
        //#debug
        //System.out.println("Midlet.buscarPorNombreProducto");
        try {
            joinThreadBusqueda();
            mvcProductoResultado.setBusquedaMVC( busquedaMVC );
            setCurrent(mvcProductoResultado);
            threadBusqueda = null;
            threadBusqueda = new Thread() {
                public void run() {
                    try {
                        rmsArticuloPorNombre.buscarPorNombreArticulos(nombre, mvcProductoResultado);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            threadBusqueda.start();
        } catch (Exception e) {
            e.printStackTrace();
            
            showError("Error : " + e, mvcProductoBusqueda.showScreen());
            
        }
    }
    
    public void limpiarMemoriaTransacciones() {
        
        
        if (currentCanjeDetalle != null) {
            currentCanjeDetalle.clear();
            currentCanjeDetalle = null;
        }
        
        if (currentCabCanje != null) {
            currentCabCanje.clear();
            currentCabCanje = null;
        }
        
        System.gc();
    }
    
    public void limpiarMemoria() {
        
        currentKPI = null;
        
        limpiarMemoriaTransacciones();
        
        System.gc();
    }
    
    public void eliminarDatos() throws Exception {
        rmsArticulo.deleteAll();
        rmsArticuloPorCodigo.deleteAll();
        rmsArticuloPorNombre.deleteAll();
        rmsKPI.deleteAll();
        rmsCanje.deleteAll();
    }
    
//    public BarsCanvas getBarras() {
//        mvcGrafico.setTitle("Canje");
//        mvcGrafico.setTotalCustomers(currentKPI.totalClientes, "Total");
//        mvcGrafico.setTotalCustomersAttended(currentKPI.clienteVisitados, "Atendido");
//        return mvcGrafico;
//    }
    
    public byte getBusquedaMVC() {
        return busquedaMVC;
    }
    
    public void setBusquedaMVC(byte busquedaMVC) {
        this.busquedaMVC = busquedaMVC;
    }
}
